package com.hwf.springboot;

import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

public class AutoConfigurationImportSelector implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //返回给spring您想让Sprig解析的类的名字，实际SpringBoot中会此处返回一百多个配置类
        //此处需要用到SPI机制
        //此行代码借助jdk的SPI会去找传入的AutoConfiguration同名的位于resources目录下的META-INF.services下对应的文件，然后在这个文本文件中可以写任意数量的配置类，在扫描到这些配置类后会将这些配置类全部实例化(但其实这里我们不需要对象，只需要类，因此spring并没有使用jdk的SPI而是自己实现了一套SPI)并返回到serviceLoader中
        ServiceLoader<AutoConfiguration> serviceLoader = ServiceLoader.load(AutoConfiguration.class);

        List<String> list = new ArrayList<>();
        //返回所有自动配置类的名字,Spring拿到后就会解析所有的配置类
        for (AutoConfiguration autoConfiguration : serviceLoader) {
            System.out.println(autoConfiguration);
            list.add(autoConfiguration.getClass().getName());
        }
        return list.toArray(new String[0]);
    }
}
